package chaoyue.study.pool;

import chaoyue.study.ThreadUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * invokeAll：全部执行完成之后才返回，并且可以指定超时时间，到达指定时间后返回已经执行完成的任务列表
 * invokeAny：只要有一个任务完成就返回，并且取消其他任务。
 */
public class ThreadPoolTest4 {
    public static void main(String[] args) throws Exception {
        ExecutorService pool = Executors.newFixedThreadPool(5);
        List<Callable<Integer>> taskList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            taskList.add(() -> {
                ThreadUtils.sleepRandom();
                System.out.println("task-" + taskId);
                return taskId;
            });
        }
        // 批量执行全部task，下面这个会阻塞，等全部任务都执行完成之后，返回FutureList
        List<Future<Integer>> futures = pool.invokeAll(taskList);
        System.out.println("main...");
        for (Future<Integer> future : futures) {
            System.out.println(future.get());
        }
        pool.shutdown();
    }
}
